#include <iostream>
#include "../include/muduo/net/TcpServer.h"
#include "../include/muduo/net/EventLoop.h"
#include "../include/muduo/net/TcpConnection.h"
#include <functional>
#include <unordered_map>


class TranslateServer
{
public:
    TranslateServer(int port):
        _server(&_baseloop,
                muduo::net::InetAddress("0.0.0.0", port),
                "TranslateServer",
                muduo::net::TcpServer::kReusePort
               )
        {
            // 设置服务器的回调函数
            _server.setConnectionCallback(std::bind(&TranslateServer::onConnection, this, std::placeholders::_1));
            _server.setMessageCallback(std::bind(&TranslateServer::onMessage, this,
                std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
        }
    
    void start()
    {
        _server.start(); // 开始事件监听
        _baseloop.loop(); // 开始事件监控，死循环
    }
private:
        // 当一个连接建立或者关闭时调用的回调函数
        void onConnection(const muduo::net::TcpConnectionPtr &conn)
        {
            if (conn->connected() == true)
                std::cout << "新连接建立成功！" << std::endl;
            else
                std::cout << "新连接断开！" << std::endl;
        }

        std::string translate(const std::string &word)
        {
            std::unordered_map<std::string, std::string> dict{
                {"hello", "你好"},
                {"world", "世界"},
                {"你好", "hello"},
                {"世界", "world"}
            };

            if (dict.find(word) == dict.end())
                return "查无此单词";
            else
                return dict[word];
        }

        // 当连接接收到请求时调用的回调函数
        void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp)
        {
            // 1.从buf中取出请求
            std::string req = buf->retrieveAllAsString();
            // 2.进行翻译业务
            std::string ret = translate(req);
            // 3.将结果发送回客户端
            conn->send(ret);
        }
private:
    // 用于事件监控，触发事件时，进行对应的事件处理操作
    muduo::net::EventLoop _baseloop;
    // 用于设置回调函数，告诉服务器收到什么事件应该如何处理
    muduo::net::TcpServer _server;
};

int main()
{
    TranslateServer svr(8085);
    svr.start();
    return 0;
}